public function toSetter(MetaClass $class, MetaClassProperty $property, MetaClassProperty $holder = null)
    {
        if ($property->getRelationId() == MetaRelation::ONE_TO_MANY || $property->getRelationId() == MetaRelation::MANY_TO_MANY) {
            // we don't need setter in such cases
            return null;
        }
        $name = $property->getName();
        $methodName = 'set' . ucfirst($name);
        if ($holder) {
            return <<<EOT

/**
 * @return {$holder->getClass()->getName()}
**/
public function {$methodName}({$property->getType()->getClassName()} \${$name})
{
\t\$this->{$holder->getName()}->{$methodName}(\${$name});
\t
\treturn \$this;
}

EOT;
        } else {
            $defaultValue = $property->isOptional() ? ' = null' : '';
            if ($property->getFetchStrategyId() == FetchStrategy::LAZY) {
                $method = <<<EOT

/**
 * @return {$property->getClass()->getName()}
**/
public function {$methodName}({$this->className} \${$name}{$defaultValue})
{
\t\$this->{$name} = \${$name};
\t\$this->{$name}Id = \${$name} ? \${$name}->getId() : null;

\treturn \$this;
}

/**
 * @return {$property->getClass()->getName()}
**/
public function {$methodName}Id(\$id{$defaultValue})
{
\t\$this->{$name} = null;
\t\$this->{$name}Id = \$id;

\treturn \$this;
}

EOT;
            } else {
                $method = <<<EOT

/**
 * @return {$property->getClass()->getName()}
**/
public function {$methodName}({$this->className} \${$name}{$defaultValue})
{
\t\$this->{$name} = \${$name};

\treturn \$this;
}

EOT;
            }
        }
        return $method;
    }