#ifndef LIBWCCL_OPS_FUNEXECCONTEXT_H
#define LIBWCCL_OPS_FUNEXECCONTEXT_H

#include <boost/noncopyable.hpp>
#include <libwccl/variables.h>
#include <libwccl/sentencecontext.h>
#include <libwccl/ops/actionexeccontext.h>

namespace Wccl {

/**
 * Class holding execution context of a functional operator
 * i.e. state that the function should operate on.
 */
class FunExecContext : boost::noncopyable
{
public:
	FunExecContext( const SentenceContext& sentence_context,
					const boost::shared_ptr<Variables>& vars)
		: sentence_context_(sentence_context), vars_(vars)
	{
	}

	FunExecContext(const ActionExecContext& action_exec_context)
		: sentence_context_(action_exec_context.sentence_context()),
		  vars_(action_exec_context.variables())
	{
		// this is intentionally left implicit :)
	}

	/**
	 * @returns Context of a sentence the operator is applied to.
	 * @note Functional operators should not change sentence state,
	 * hence the const reference.
	 */
	const SentenceContext& sentence_context() const {
		return sentence_context_;
	}

	/**
	 * @returns Pointer to variables the operator should operate with.
	 * @note Variables should be accesible to modifications, but overall
	 * object should not get replaced, hence the const pointer.
	 */
	const boost::shared_ptr<Variables>& variables() const {
		return vars_;
	}

private:
	const SentenceContext& sentence_context_;
	const boost::shared_ptr<Variables> vars_;
};

} /* end ns Wccl */

#endif // LIBWCCL_OPS_FUNEXECCONTEXT_H