diff --git a/facho/model/fields/function.py b/facho/model/fields/function.py
new file mode 100644
index 0000000..34e3195
--- /dev/null
+++ b/facho/model/fields/function.py
@@ -0,0 +1,24 @@
+from .field import Field
+from .model import Model
+
+class Function(Field):
+ def __init__(self, getter, setter=None, field=None):
+ self.field = field
+ self.getter = getter
+ self.setter = setter
+
+ def __get__(self, inst, cls):
+ if inst is None:
+ return self
+ assert self.name is not None
+
+ if self.field is None:
+ return self._call(inst, self.getter, self.name)
+ else:
+ obj = Model(self.field)
+ return self._call(inst, self.getter, self.name, obj)
+
+ def __set__(self, inst, value):
+ if self.setter is None:
+ return super().__set__(self.name, value)
+ self._call(inst, self.setter, self.name, value)
diff --git a/tests/test_model.py b/tests/test_model.py
index a4fd540..fa92e9f 100644
--- a/tests/test_model.py
+++ b/tests/test_model.py
@@ -217,13 +217,15 @@ def test_field_function_with_model():
class Person(facho.model.Model):
__name__ = 'Person'
- hash = fields.Function('get_hash', field=fields.Model(Hash))
+ hash = fields.Function('get_hash', field=Hash)
def get_hash(self, name, field):
field.id = 'calculate'
+ return field
person = Person()
- assert ''
+ assert person.hash.id == 'calculate'
+ assert ''
def test_field_function():
class Person(facho.model.Model):