#ifndef SWIG_LIBWCCL_FUNCTIONALOPERATOR_I
#define SWIG_LIBWCCL_FUNCTIONALOPERATOR_I

%module libcclfunctionaloperator
%{
  #include <libwccl/ops/operator.h>
%}

%include "libcclvalue.i"
%include "libcclvariables.i"
%include "libcclsentencecontext.i"
%include "libcclparsedexpression.i"

%include "std_string.i"
%include "boost_shared_ptr.i"

// %template(ValuePtr) boost::shared_ptr<Wccl::Value>;
%template(FunctionalOperatorPtr) boost::shared_ptr<Wccl::FunctionalOperator>;

namespace Wccl {
  class FunctionalOperator : public ParsedExpression {
  public:
    virtual boost::shared_ptr<const Value> base_apply(const SentenceContext& sc) = 0;

    /* --------------------------------------------------------------------- */
    boost::shared_ptr<FunctionalOperator> clone_ptr() const;
    boost::shared_ptr<FunctionalOperator> clone_clean_ptr() const;

  protected:
    explicit FunctionalOperator(const Variables& variables);
    FunctionalOperator* clone_internal() const = 0;
  };
}

using namespace boost;
using namespace std;
using namespace Wccl;

#endif /* SWIG_LIBWCCL_FUNCTIONALOPERATOR_I */