<?php

namespace RedBeanPHP;


/**
 * SimpleModelInterface
 * Interface For All RedBeanPHP Models using FUSE.
 *
 * RedBeanPHP FUSE is a mechanism to connect beans to posthoc
 * models. Models are connected to beans by naming conventions.
 * Actions on beans will result in actions on models.
 *
 * @file       RedBeanPHP/SimpleModelInterface.php
 * @author     Gabor de Mooij and the RedBeanPHP Team
 * @license    BSD/GPLv2
 *
 * @copyright
 * copyright (c) G.J.G.T. (Gabor) de Mooij and the RedBeanPHP Community
 * This source file is subject to the BSD/GPLv2 License that is bundled
 * with this source code in the file license.txt.
 */
interface SimpleModelInterface
{
    /**
     * Used by FUSE: the ModelHelper class to connect a bean to a model.
     * This method loads a bean in the model.
     *
     * @param OODBBean $bean bean to load
     *
     * @return void
     */
    public function loadBean(OODBBean $bean);

    /**
     * Magic Getter to make the bean properties available from
     * the $this-scope.
     *
     * @note this method returns a value, not a reference!
     *       To obtain a reference unbox the bean first!
     *
     * @param string $prop property to get
     *
     * @return mixed
     */
    public function __get($prop);

    /**
     * Magic Setter.
     * Sets the value directly as a bean property.
     *
     * @param string $prop property to set value of
     * @param mixed $value value to set
     *
     * @return void
     */
    public function __set($prop, $value);

    /**
     * Isset implementation.
     * Implements the isset function for array-like access.
     *
     * @param string $key key to check
     *
     * @return boolean
     */
    public function __isset($key);

    /**
     * Box the bean using the current model.
     * This method wraps the current bean in this model.
     * This method can be reached using FUSE through a simple
     * OODBBean. The method returns a RedBeanPHP Simple Model.
     * This is useful if you would like to rely on PHP type hinting.
     * You can box your beans before passing them to functions or methods
     * with typed parameters.
     *
     * Note about beans vs models:
     * Use unbox to obtain the bean powering the model. If you want to use bean functionality,
     * you should -always- unbox first. While some functionality (like magic get/set) is
     * available in the model, this is just read-only. To use a model as a typical RedBean
     * OODBBean you should always unbox the model to a bean. Models are meant to
     * expose only domain logic added by the developer (business logic, no ORM logic).
     *
     * @return SimpleModel|SimpleModelInterface
     */
    public function box();

    /**
     * Unbox the bean from the model.
     * This method returns the bean inside the model.
     *
     * Note about beans vs models:
     * Use unbox to obtain the bean powering the model. If you want to use bean functionality,
     * you should -always- unbox first. While some functionality (like magic get/set) is
     * available in the model, this is just read-only. To use a model as a typical RedBean
     * OODBBean you should always unbox the model to a bean. Models are meant to
     * expose only domain logic added by the developer (business logic, no ORM logic).
     *
     * @return OODBBean
     */
    public function unbox();
}
