'id', // 'T' => 'Title', // 'A' => 'Author', // 'C' => 'Composer', // 'G' => 'Group,', // 'H' => 'History', // 'O' => 'Origin', // 'R' => 'Rhythm', // ]; public function __construct(array $params, Uuid $identity = null) { $this->setIdentity($identity); foreach ($params as $attribute => $value) { $this->set($attribute, $value); } } public function getETag() { return md5(implode(';', array_flatten([ $this->getTitles(), $this->getAuthors(), $this->getComposers(), $this->getGroups(), $this->getHistory(), $this->getOrigins(), $this->getRhythms(), //TODO: add settings ]))); } /** * @param UnsignedIntegerAtom $index * @return $this */ public function setIndex(UnsignedIntegerAtom $index) : Tune { $this->index = $index->getValue(); return $this; } /** * @return Int */ public function getIndex() : int { return $this->index; } /** * @return string[] */ public function getTitles() : array { return $this->titles; } /** * @param string $title * @return $this * @deprecated */ public function addTitle(string $title) : Tune { $this->titles[] = $title; return $this; } /** * @param Author $author * @return $this */ public function addAuthor(Author $author) : Tune { $this->authors[] = $author; return $this; } /** * @return Author[] */ public function getAuthors() : array //TODO: PersonCollection { return $this->authors; } /** * @param Composer $composer * @return $this */ public function addComposer(Composer $composer) : Tune { $this->composers[] = $composer; return $this; } /** * @return Composer[] */ public function getComposers() { return $this->composers; } /** * @param string $group * @return $this */ public function addGroup(string $group) : Tune { $this->groups[] = $group; return $this; } /** * @return array */ public function getGroups() { return $this->groups; } /** * @param string $historyLine * @return $this */ public function addHistoryLine(string $historyLine) { $this->history[] = $historyLine; return $this; } /** * @return array */ public function getHistory() { return $this->history; } /** * @param string $origin * @return $this */ public function addOrigin(string $origin) { $this->origins[] = $origin; return $this; } /** * @return array */ public function getOrigins() { return $this->origins; } /** * @param StringAtom $rhythm * @return $this */ public function addRhythm(string $rhythm) { $this->rhythms[] = $rhythm; return $this; } /** * @return array */ public function getRhythms() { return $this->rhythms; } /** * @param Setting $tuneSetting * @return $this */ public function addSetting(Setting $tuneSetting) { $this->tuneSettings[] = $tuneSetting; return $this; } /** * @return Setting[] */ public function getSettings() { return $this->tuneSettings; } /** * @param $attribute * @param $value */ protected function set($attribute, $value) { switch ($attribute) { case 'index': call_user_func([$this, 'set'.$attribute], $value); break; case 'Authors': call_user_func([$this, 'addAuthor'], $value); break; case 'Composers': $this->addComposer($value); break; case 'settings': foreach ($value as $key => $settingParams) { $this->addSetting(Setting::create($settingParams)); } break; default: $this->append($attribute, $value); } } protected function append($attribute, MultivalueAttribute $values) { $method = 'add' . substr($attribute, 0, -1); foreach ($values->toArray() as $value) { call_user_func([$this, $method], $value); } } /** * Checks whether this model has the given attribute set. * * @param string $attribute * * @return boolean */ public function has($attribute) { return isset($this->{$attribute}); } /** * Get the value associated with the given attribute. * * @param string $attribute * * @return mixed */ public function get($attribute) { // TODO: Implement get() method. } /** * Get all the attributes associated with this model. * * @return array */ public function getAll() { // TODO: Implement getAll() method. } /** * @param StringAtom $musicLine * @return $this * @deprecated this should be on the setting */ public function addMusicLine(string $musicLine) { $this->music .= $musicLine . PHP_EOL; return $this; } public function getMusic() { return $this->music; } public function merge(Tune $source) { //TODO $this->titles = array_merge($this->getTitles(), $source->getTitles()); $this->authors = array_merge($this->getAuthors(), $source->getAuthors()); $this->composers = array_merge($this->getComposers(), $source->getComposers()); $this->history = array_merge($this->getHistory(), $source->getHistory()); $this->tuneSettings = array_merge($this->getSettings(), $source->getSettings()); return $this; } }