use nqp;
use Red::Attr::Column;

=head2 MetamodelX::Red::OnDB

unit role MetamodelX::Red::OnDB;

has $!is-on-db-attr;

method is-on-db-attr(|) {
    $!is-on-db-attr;
}

sub is-on-db-attr-build(|){
    False
}

method set-helper-attrs(Mu \type) {
    my %attr is Set = type.^attributes>>.name;
    unless %attr<%!___IS_ON_DB___> {
            $!is-on-db-attr = Attribute.new: :name<%!___IS_ON_DB___>, :package(type), :type(Bool), :!has_accessor;
            $!is-on-db-attr.set_build: &is-on-db-attr-build;
            type.^add_attribute: $!is-on-db-attr;
    }
}

#| Checks if the instance of model has a record in the database or not.
#| For example, `Person.^create(...).^is-on-db` returns True, because `^create` was called,
#| but `Person.new(...).^is-on-db` will return False, because the created object does not have
#| a representation in the database without calls to `^create` or `^save` done.
multi method is-on-db(\instance) {
    $!is-on-db-attr.get_value(instance)
}

multi method not-on-db(\instance) {
    $!is-on-db-attr.get_value(instance) = False
}

#| Sets that that object is on DB
multi method saved-on-db(\instance) {
    $!is-on-db-attr.get_value(instance) = True
}