diff --git a/builder/etc/builder.urm.puml b/builder/etc/builder.urm.puml index 631c62cc4..df8d73f36 100644 --- a/builder/etc/builder.urm.puml +++ b/builder/etc/builder.urm.puml @@ -86,15 +86,15 @@ package com.iluwatar.builder { + values() : Weapon[] {static} } } -Hero --> "-profession" Profession Builder ..+ Hero +Hero --> "-profession" Profession Hero --> "-armor" Armor +Builder --> "-hairColor" HairColor Builder --> "-weapon" Weapon Builder --> "-hairType" HairType -Builder --> "-hairColor" HairColor Hero --> "-hairColor" HairColor Builder --> "-profession" Profession -Hero --> "-weapon" Weapon Hero --> "-hairType" HairType +Hero --> "-weapon" Weapon Builder --> "-armor" Armor @enduml \ No newline at end of file diff --git a/business-delegate/etc/business-delegate.urm.puml b/business-delegate/etc/business-delegate.urm.puml index e78b147e0..40aa2d6f0 100644 --- a/business-delegate/etc/business-delegate.urm.puml +++ b/business-delegate/etc/business-delegate.urm.puml @@ -46,8 +46,8 @@ package com.iluwatar.business.delegate { + values() : ServiceType[] {static} } } -BusinessDelegate --> "-serviceType" ServiceType BusinessLookup --> "-ejbService" EjbService +BusinessDelegate --> "-serviceType" ServiceType Client --> "-businessDelegate" BusinessDelegate BusinessDelegate --> "-businessService" BusinessService BusinessDelegate --> "-lookupService" BusinessLookup diff --git a/chain/etc/chain.urm.puml b/chain/etc/chain.urm.puml index 3add4037d..4a2f6a188 100644 --- a/chain/etc/chain.urm.puml +++ b/chain/etc/chain.urm.puml @@ -53,8 +53,8 @@ package com.iluwatar.chain { } } RequestHandler --> "-next" RequestHandler -OrcKing --> "-chain" RequestHandler Request --> "-requestType" RequestType +OrcKing --> "-chain" RequestHandler OrcCommander --|> RequestHandler OrcOfficer --|> RequestHandler OrcSoldier --|> RequestHandler diff --git a/dao/etc/dao.urm.puml b/dao/etc/dao.urm.puml index 2b3f7fca6..b0a5b2c54 100644 --- a/dao/etc/dao.urm.puml +++ b/dao/etc/dao.urm.puml @@ -34,9 +34,10 @@ package com.iluwatar.dao { + getById(int) : Optional {abstract} + update(Customer) : boolean {abstract} } - interface CustomerSchemaSql { + class CustomerSchemaSql { + CREATE_SCHEMA_SQL : String {static} + DELETE_SCHEMA_SQL : String {static} + - CustomerSchemaSql() } class DbCustomerDao { - dataSource : DataSource diff --git a/event-driven-architecture/etc/event-driven-architecture.urm.puml b/event-driven-architecture/etc/event-driven-architecture.urm.puml index 6b67f0a0e..2eb79e438 100644 --- a/event-driven-architecture/etc/event-driven-architecture.urm.puml +++ b/event-driven-architecture/etc/event-driven-architecture.urm.puml @@ -54,8 +54,8 @@ package com.iluwatar.eda { + main(args : String[]) {static} } } -UserCreatedEvent --> "-user" User UserUpdatedEvent --> "-user" User +UserCreatedEvent --> "-user" User AbstractEvent ..|> Event UserCreatedEvent --|> AbstractEvent UserUpdatedEvent --|> AbstractEvent diff --git a/flux/etc/flux.urm.puml b/flux/etc/flux.urm.puml index 40637d624..11ac26d60 100644 --- a/flux/etc/flux.urm.puml +++ b/flux/etc/flux.urm.puml @@ -99,15 +99,15 @@ package com.iluwatar.flux.dispatcher { } } MenuAction --> "-menuItem" MenuItem -MenuStore --> "-selected" MenuItem Action --> "-type" ActionType Dispatcher --> "-instance" Dispatcher +MenuStore --> "-selected" MenuItem ContentView --> "-content" Content Dispatcher --> "-stores" Store MenuView --> "-selected" MenuItem Store --> "-views" View -ContentStore --> "-content" Content ContentAction --> "-content" Content +ContentStore --> "-content" Content ContentAction --|> Action MenuAction --|> Action ContentStore --|> Store diff --git a/hexagonal/etc/hexagonal.urm.puml b/hexagonal/etc/hexagonal.urm.puml index f6dd970c0..9ca6e6f9f 100644 --- a/hexagonal/etc/hexagonal.urm.puml +++ b/hexagonal/etc/hexagonal.urm.puml @@ -11,9 +11,13 @@ package com.iluwatar.hexagonal.service { class ConsoleLottery { - LOGGER : Logger {static} + ConsoleLottery() + - addFundsToLotteryAccount(bank : WireTransfers, scanner : Scanner) {static} + - checkTicket(service : LotteryService, scanner : Scanner) {static} + main(args : String[]) {static} - printMainMenu() {static} + - queryLotteryAccountFunds(bank : WireTransfers, scanner : Scanner) {static} - readString(scanner : Scanner) : String {static} + - submitTicket(service : LotteryService, scanner : Scanner) {static} } } package com.iluwatar.hexagonal.mongo { @@ -252,16 +256,16 @@ package com.iluwatar.hexagonal.eventlog { + ticketWon(details : PlayerDetails, prizeAmount : int) } } -LotteryAdministration --> "-wireTransfers" WireTransfers -LotteryTicket --> "-id" LotteryTicketId LotteryTicket --> "-playerDetails" PlayerDetails -LotteryService --> "-notifications" LotteryEventLog -LotteryAdministration --> "-repository" LotteryTicketRepository -LotteryTicket --> "-lotteryNumbers" LotteryNumbers MongoEventLog --> "-stdOutEventLog" StdOutEventLog LotteryService --> "-wireTransfers" WireTransfers -SampleData --> "-PLAYERS" PlayerDetails LotteryAdministration --> "-notifications" LotteryEventLog +LotteryAdministration --> "-wireTransfers" WireTransfers +LotteryService --> "-notifications" LotteryEventLog +LotteryTicket --> "-id" LotteryTicketId +LotteryAdministration --> "-repository" LotteryTicketRepository +LotteryTicket --> "-lotteryNumbers" LotteryNumbers +SampleData --> "-PLAYERS" PlayerDetails RandomNumberGenerator ..+ LotteryNumbers LotteryService --> "-repository" LotteryTicketRepository CheckResult ..+ LotteryTicketCheckResult diff --git a/hexagonal/etc/ports_and_adapters.xml b/hexagonal/etc/ports_and_adapters.xml index 0e64414b8..9df3173d9 100644 --- a/hexagonal/etc/ports_and_adapters.xml +++ b/hexagonal/etc/ports_and_adapters.xml @@ -1 +1,25 @@ + 7Zpdk6I4FIZ/jbdbJAHEyx7nY/diqrqqd2tnLiOJSDUSK6ZHe3/9BkmUfFiDDqBM2TcNBwLxOe85nBOYoPl6/4XjzeorI7SYwIDsJ+jjBEKA4kj+qyzvtWUag9qQ8Zyok06Gl/w/qoyBsr7lhG6NEwVjhcg3pjFlZUlTYdgw52xnnrZkhXnXDc6oY3hJceFa/82JWNXWJApO9j9pnq30nUGgjixw+ppx9laq+00gWh7+6sNrrK+lzt+uMGG7hgl9mqA5Z0zUW+v9nBYVW42tHvf5zNHjvDktRZsBqB7wAxdvVM/4MC/xrlnIKW6qzRXd44yVE/RhQ3m+poLyk/X5ZPqwW+WCvmxwWo3aSYFI20qsC7kH5Ka6I+WC7s/OGhxZSI1RJi/N3+UpagBMFD4lL6D3dydnIa2lVcNRMFZGrASSHa99giQ3FCc/MzhKZmgaGcyOKBrMAPQwO2r7V5iFDrM549ThJgfJEKc/B7LMi2LOCsYP46oYg2kq7VvB2SttHCHxIo7ibhCGATARJshBqDNfk2AXoot+Lrpr4RFMk6UXXpwmdLHsCF5s6W/qwkMe+aEO4MW/GzwEPQmvJ3jT0cMDMxNeGA0GLxk7PDQ1H7VDKm82fnh2zoODwdPlz3jphdCUHoyGkx5oUeRdTS+iCQl99BK4QHFHxUoUWfQ89V5v9Fq0FXdOz9ZeMCC9Nk/ckjxVfa7cK1lJTWJ0n4tvje3vcjuotks5k2/Nne/6rJJ8zqsJHQ7Vd6PE6ZEtenJG7I2n1KhQBeYZFU0duJAbECMPRG3jtMAi/2HOwkdW3eGZ5XJ+Z7vECFjOqWevRjWbZOtCCJkXCu2Cvv7NzoUOjj7+7Ha+b1MwXOz7P6IefQwfPr7Qx33WNYNkR5s60nXuANkR9lnXDEIPWc8WNBvu2aJn+8v5JfDkF/V0Ac2nS3e5J/Hkntkj91yWe7S7O/U/OO/9/nzfWC5/+L6d70dfldsrOSEcbiXHs4R9ZeTUGdEXO41E2mX0TD3Rc1+Vue2gq6Mn6S963BX4Z8bF1hGBlLcwPW/GhFJGM4CUCRd5VsrdVDrz8FaoCpY8xcWTOrDOCSnOBWcH8YVmoYHzGDgNWYS+12pdxJe7SP/PVlKQZ1Q0ltVvtVEfXrRSojD3/w4NALvudd9hAN97x7ALQO6ywN90WwUDzqiS903h2CvFiZucZ32xcdvmv6RqMi6zFCtvjuZY4et851lN6g2N221+xAIv8Pb28RQHJhcwG04yOrU1uHxl6au0kLvBYz3dYOTi6S3doPF2irpKNAqe2I96mIIHWJ6Mr20XgF059dcuoD5axWEEoOsRQwDThwAuFECbfvE+Ox5dlxkCSB4CuFAAXbW8vpcRvldRHT4CfAK46WrhKAXQ5quzOxUAdAWAbrpkOEoBuE35E8Eb2Y//XuseVh+CPP1ZR+secvf0dXftkdMn9OjT/w== \ No newline at end of file diff --git a/hexagonal/etc/presentation.html b/hexagonal/etc/presentation.html index 74361ad27..5c6d1d0a5 100644 --- a/hexagonal/etc/presentation.html +++ b/hexagonal/etc/presentation.html @@ -1,3 +1,27 @@ + diff --git a/intercepting-filter/etc/intercepting-filter.urm.puml b/intercepting-filter/etc/intercepting-filter.urm.puml index 2b090cfff..5c1e79ee4 100644 --- a/intercepting-filter/etc/intercepting-filter.urm.puml +++ b/intercepting-filter/etc/intercepting-filter.urm.puml @@ -77,8 +77,8 @@ package com.iluwatar.intercepting.filter { } AbstractFilter --> "-next" Filter DListener --+ Target -FilterManager --> "-filterChain" FilterChain FilterChain --> "-chain" Filter +FilterManager --> "-filterChain" FilterChain AbstractFilter ..|> Filter AddressFilter --|> AbstractFilter ContactFilter --|> AbstractFilter diff --git a/lazy-loading/etc/lazy-loading.urm.puml b/lazy-loading/etc/lazy-loading.urm.puml index e982cb0d3..aaf49f1df 100644 --- a/lazy-loading/etc/lazy-loading.urm.puml +++ b/lazy-loading/etc/lazy-loading.urm.puml @@ -34,7 +34,7 @@ package com.iluwatar.lazy.loading { + get() : Heavy } } -HolderNaive --> "-heavy" Heavy HolderThreadSafe --> "-heavy" Heavy +HolderNaive --> "-heavy" Heavy HeavyFactory --> "-heavyInstance" Heavy @enduml \ No newline at end of file diff --git a/module/error.txt b/module/error.txt index e69de29bb..ee28c3c1c 100644 --- a/module/error.txt +++ b/module/error.txt @@ -0,0 +1,23 @@ +==== + The MIT License + Copyright (c) 2014 Ilkka Seppälä + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +==== + diff --git a/module/etc/module.urm.puml b/module/etc/module.urm.puml index d78f12da8..233691cf7 100644 --- a/module/etc/module.urm.puml +++ b/module/etc/module.urm.puml @@ -16,7 +16,7 @@ package com.iluwatar.module { - singleton : ConsoleLoggerModule {static} - ConsoleLoggerModule() + getSingleton() : ConsoleLoggerModule {static} - + prepare() + + prepare() : ConsoleLoggerModule + printErrorString(value : String) + printString(value : String) + unprepare() @@ -30,7 +30,7 @@ package com.iluwatar.module { - singleton : FileLoggerModule {static} - FileLoggerModule() + getSingleton() : FileLoggerModule {static} - + prepare() + + prepare() : FileLoggerModule + printErrorString(value : String) + printString(value : String) + unprepare() diff --git a/module/output.txt b/module/output.txt index e69de29bb..ee28c3c1c 100644 --- a/module/output.txt +++ b/module/output.txt @@ -0,0 +1,23 @@ +==== + The MIT License + Copyright (c) 2014 Ilkka Seppälä + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +==== + diff --git a/object-mother/etc/object-mother.urm.puml b/object-mother/etc/object-mother.urm.puml index 9b26450f0..1bb52f2ed 100644 --- a/object-mother/etc/object-mother.urm.puml +++ b/object-mother/etc/object-mother.urm.puml @@ -1,13 +1,15 @@ @startuml package com.iluwatar.objectmother { - class RoyaltyObjectMother { - + RoyaltyObjectMother() - + createDrunkKing() : King {static} - + createFlirtyQueen() : Queen {static} - + createHappyDrunkKing() : King {static} - + createHappyKing() : King {static} - + createNotFlirtyQueen() : Queen {static} - + createSoberUnhappyKing() : King {static} + class King { + ~ isDrunk : boolean + ~ isHappy : boolean + + King() + + flirt(queen : Queen) + + isHappy() : boolean + + makeDrunk() + + makeHappy() + + makeSober() + + makeUnhappy() } class Queen { - isDrunk : boolean @@ -28,18 +30,16 @@ package com.iluwatar.objectmother { + makeSober() {abstract} + makeUnhappy() {abstract} } - class King { - ~ isDrunk : boolean - ~ isHappy : boolean - + King() - + flirt(queen : Queen) - + isHappy() : boolean - + makeDrunk() - + makeHappy() - + makeSober() - + makeUnhappy() + class RoyaltyObjectMother { + + RoyaltyObjectMother() + + createDrunkKing() : King {static} + + createFlirtyQueen() : Queen {static} + + createHappyDrunkKing() : King {static} + + createHappyKing() : King {static} + + createNotFlirtyQueen() : Queen {static} + + createSoberUnhappyKing() : King {static} } } -Queen ..|> Royalty King ..|> Royalty +Queen ..|> Royalty @enduml \ No newline at end of file diff --git a/object-pool/etc/object-pool.urm.puml b/object-pool/etc/object-pool.urm.puml index 21ef76e0d..ca74f8cec 100644 --- a/object-pool/etc/object-pool.urm.puml +++ b/object-pool/etc/object-pool.urm.puml @@ -6,8 +6,8 @@ package com.iluwatar.object.pool { + main(args : String[]) {static} } abstract class ObjectPool { - - available : HashSet - - inUse : HashSet + - available : Set + - inUse : Set + ObjectPool() + checkIn(instance : T) + checkOut() : T diff --git a/poison-pill/etc/poison-pill.urm.puml b/poison-pill/etc/poison-pill.urm.puml index 923449e10..5c2b9fa2b 100644 --- a/poison-pill/etc/poison-pill.urm.puml +++ b/poison-pill/etc/poison-pill.urm.puml @@ -60,8 +60,8 @@ package com.iluwatar.poison.pill { } } SimpleMessageQueue --> "-queue" Message -Headers ..+ Message Consumer --> "-queue" MqSubscribePoint +Headers ..+ Message Producer --> "-queue" MqPublishPoint Message --> "-POISON_PILL" Message MessageQueue --|> MqPublishPoint diff --git a/promise/etc/promise.urm.puml b/promise/etc/promise.urm.puml index 9c6d09cde..45cae7ff1 100644 --- a/promise/etc/promise.urm.puml +++ b/promise/etc/promise.urm.puml @@ -72,7 +72,7 @@ package com.iluwatar.promise { } TransformAction --> "-src" Promise TransformAction --+ Promise -ConsumeAction --> "-src" Promise ConsumeAction --+ Promise +ConsumeAction --> "-src" Promise Promise --|> PromiseSupport @enduml \ No newline at end of file diff --git a/proxy/etc/presentation.html b/proxy/etc/presentation.html index 7964ae124..f669bf4e9 100644 --- a/proxy/etc/presentation.html +++ b/proxy/etc/presentation.html @@ -1,3 +1,27 @@ + diff --git a/proxy/etc/proxy-concept.xml b/proxy/etc/proxy-concept.xml index c418c8b36..83373a929 100644 --- a/proxy/etc/proxy-concept.xml +++ b/proxy/etc/proxy-concept.xml @@ -1 +1,25 @@ + 7Vhtb5swEP41kbYPnQJuaPexeVv3YVK1aur60YEL8WowM05K+utnYxswkC6p2rSbmkoNfnx3vpfnLsAATZLiC8fZ6huLgA78YVQM0HTg+x4KPPmlkK1GziwQcxIZoRq4Jg9gwKFB1ySC3BEUjFFBMhcMWZpCKBwMc87uXbElo+6pGY6hA1yHmHbRGxKJlUbPR8MavwQSr+zJ3tDsLHB4F3O2Ts15Ax8ty4/eTrC1ZeTzFY7YfQNCswGacMaEvkqKCVCVW5s2rTffsVv5zSEV+yica4UNpmuwHgdUqo4z5Z3YmowEv9fKpXGCeUzSAbqQu8OskP8lWAam8BPBMr132tgTUIgTTEls9ELpG/DapryKzXd5MmkAOJEGx7S7+qpsLHEIFeyqOBZl/KR9yoJ3EAtcrxe/FKtq7UVbVmJZG1txlTLLZRudtzvQJ6WYwlI0crzLdje8PpdfxgMlW9b4ww15wDz6qKU3TLJuT/d8xzF/A1wQ2Z4XmkXTkmdjw6mpdmjMpNSSlt20JJLlaLxkqTDDxfPNeo4TQtVYugS6AWVVlU4kVAkpGak6YZTx8mTbvWicC87uoLEzLD+KahxHRMbb2Juezrz5qIpEuQ/Fzhb1qsaXAxVYAoJvpYhR8M/NrDCz1A6h+3owVeNk5Q4lMxDNMIwr0/VAkBdmJvTPB+vumxoQVTd+B0yP1awR2fQGbFOuHPcf68g8w+lBPSLddnUquPTl9VvlhYmPfJf4fcz3TnuYHzwH8f23TPwrzortO+X/O8oHnkv5s9ERGY/eIuN336VNqCrE/k3wj99SzAL19zw0G70iy7pPHLNCQBrlnQpJ8EI9y8nVgrLwTsYuIZv8QC/nZVmmQzfjMg98+1Phn0Z2eWv3CiIaW3J1awxoDyDqPBu28iq9ZGsegnuLJCTtQTQeq7rpbybYJpMDxYJs3CP7MmzMXTGiWL+jlAi1aqQ9NUrNB8GWHd/7iyEdXsdQWe8qxP0o8PmoFPCaBKiL/tOoVAQodw5v1SeSxn8nzUGkQd37sR85PEYYlkHq8kXN6wjnK4gMLZp0MZTwOpSoZ0mXSE8sPnov/mHF77s12V35lKVQ9izmomd8NOZFKWLWbULs8RPSJcvz/YToEI/CiKD1hqF643AsSsgi4W1DLFMC+eEO1wzTFvfkm1zWb1y1eP1aG83+AA== \ No newline at end of file diff --git a/reader-writer-lock/etc/reader-writer-lock.urm.puml b/reader-writer-lock/etc/reader-writer-lock.urm.puml index c0302cd6d..b71cf73f6 100644 --- a/reader-writer-lock/etc/reader-writer-lock.urm.puml +++ b/reader-writer-lock/etc/reader-writer-lock.urm.puml @@ -56,6 +56,6 @@ package com.iluwatar.reader.writer.lock { } ReaderWriterLock --> "-readerLock" ReadLock ReadLock --+ ReaderWriterLock -ReaderWriterLock --> "-writerLock" WriteLock WriteLock --+ ReaderWriterLock +ReaderWriterLock --> "-writerLock" WriteLock @enduml \ No newline at end of file diff --git a/semaphore/etc/semaphore.urm.puml b/semaphore/etc/semaphore.urm.puml index c40f4e026..168fd17e7 100644 --- a/semaphore/etc/semaphore.urm.puml +++ b/semaphore/etc/semaphore.urm.puml @@ -18,7 +18,7 @@ package com.iluwatar.semaphore { + values() : FruitType[] {static} } class FruitBowl { - - fruit : ArrayList + - fruit : List + FruitBowl() + countFruit() : int + put(f : Fruit) @@ -48,8 +48,8 @@ package com.iluwatar.semaphore { + release() } } -Fruit --> "-type" FruitType FruitType ..+ Fruit +Fruit --> "-type" FruitType FruitShop --> "-semaphore" Semaphore FruitBowl --> "-fruit" Fruit Semaphore ..|> Lock diff --git a/state/etc/state.urm.puml b/state/etc/state.urm.puml index ea9a6383a..207a227d8 100644 --- a/state/etc/state.urm.puml +++ b/state/etc/state.urm.puml @@ -31,8 +31,8 @@ package com.iluwatar.state { + onEnterState() {abstract} } } -AngryState --> "-mammoth" Mammoth PeacefulState --> "-mammoth" Mammoth +AngryState --> "-mammoth" Mammoth Mammoth --> "-state" State AngryState ..|> State PeacefulState ..|> State diff --git a/step-builder/etc/step-builder.urm.puml b/step-builder/etc/step-builder.urm.puml index 09fdd05ec..dc6087340 100644 --- a/step-builder/etc/step-builder.urm.puml +++ b/step-builder/etc/step-builder.urm.puml @@ -76,10 +76,10 @@ package com.iluwatar.stepbuilder { } } WeaponStep ..+ CharacterStepBuilder -SpellStep ..+ CharacterStepBuilder CharacterSteps ..+ CharacterStepBuilder -ClassStep ..+ CharacterStepBuilder AbilityStep ..+ CharacterStepBuilder +SpellStep ..+ CharacterStepBuilder +ClassStep ..+ CharacterStepBuilder NameStep ..+ CharacterStepBuilder BuildStep ..+ CharacterStepBuilder CharacterSteps ..|> NameStep