Claude-skill-registry acc-create-builder
Generates Builder pattern for PHP 8.5. Creates step-by-step object construction with fluent interface and validation. Includes unit tests.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/acc-create-builder" ~/.claude/skills/majiayu000-claude-skill-registry-acc-create-builder && rm -rf "$T"
manifest:
skills/data/acc-create-builder/SKILL.mdsource content
Builder Pattern Generator
Creates Builder pattern infrastructure for step-by-step construction of complex objects.
When to Use
| Scenario | Example |
|---|---|
| Many constructor parameters | Order with 10+ fields |
| Optional parameters | Email with optional CC, BCC |
| Complex validation | Build-time validation |
| Step-by-step construction | Query building |
| Multiple representations | Different order types |
Component Characteristics
Builder Interface
- Defines building steps
- Returns self for fluent interface
- Has build() method for final product
Concrete Builder
- Implements building steps
- Maintains product state
- Validates before building
Director (Optional)
- Defines construction order
- Reusable build sequences
- Hides complexity from client
Generation Process
Step 1: Analyze Requirements
Determine:
- Target product class
- Required vs optional properties
- Validation rules
- Whether Director is needed
Step 2: Generate Builder Components
Path:
src/Domain/{BoundedContext}/Builder/
— Builder contract{Name}BuilderInterface.php
— Concrete builder implementation{Name}Builder.php
— Validation exceptionBuilderValidationException.php
— Optional director for common builds{Name}Director.php
Step 3: Generate Tests
Path:
tests/Unit/Domain/{BoundedContext}/Builder/
— Builder functionality tests{Name}BuilderTest.php
File Placement
| Component | Path |
|---|---|
| Builder Interface | |
| Concrete Builder | |
| Director | |
| Exception | |
| Unit Tests | |
Naming Conventions
| Component | Pattern | Example |
|---|---|---|
| Interface | | |
| Concrete Builder | | |
| Director | | |
| Exception | | |
| Test | | |
Quick Template Reference
Builder Interface
interface {Name}BuilderInterface { public function with{Property1}({Type1} $value): self; public function with{Property2}({Type2} $value): self; public function build(): {Product}; public function reset(): self; }
Concrete Builder
final class {Name}Builder implements {Name}BuilderInterface { private ?{Type1} ${property1} = null; private ?{Type2} ${property2} = null; private array $errors = []; public function with{Property1}({Type1} $value): self { $this->{property1} = $value; return $this; } public function build(): {Product} { $this->validate(); if ($this->errors !== []) { throw new BuilderValidationException($this->errors); } return new {Product}(...); } public function reset(): self { $this->{property1} = null; $this->errors = []; return $this; } }
Director
final readonly class {Name}Director { public function __construct(private {Name}BuilderInterface $builder) {} public function buildMinimal{Name}(/* required params */): {Product} { return $this->builder ->reset() ->with{Required1}($value1) ->build(); } public function buildFull{Name}(/* all params */): {Product} { return $this->builder ->reset() ->with{Property1}($value1) ->with{Property2}($value2) ->build(); } }
Usage Example
// Direct builder usage $order = (new OrderBuilder()) ->forCustomer($customerId) ->withShippingAddress($address) ->addItem($item1) ->addItem($item2) ->withDiscountCode('SAVE10') ->build(); // Using Director $director = new OrderDirector(new OrderBuilder()); $minimalOrder = $director->buildMinimalOrder($customerId, $address, $item); $giftOrder = $director->buildGiftOrder($customerId, $shipping, $billing, $items, 'Happy Birthday!');
Anti-patterns to Avoid
| Anti-pattern | Problem | Solution |
|---|---|---|
| No Validation | Invalid objects built | Validate in build() |
| Mutable Product | Product can change after build | Return immutable objects |
| Missing Reset | Builder state persists | Add reset() method |
| Too Many Steps | Hard to use | Use Director or defaults |
| No Fluent Interface | Verbose client code | Return self from setters |
References
For complete PHP templates and examples, see:
— Builder, QueryBuilder templatesreferences/templates.md
— OrderBuilder, EmailBuilder examples and testsreferences/examples.md