title: What is the prefered way to extend the Activiti process engine functionalities?
body: <p>Activiti is a promising business process engine, many organizations has started to develop business process management systems using activiti.</p>
  
  <p>In my case I would like to use activiti to develop a BPM system that fulfills a specific business requirements,However the activiti engine functionalities covers only about 70% of my business requirements. </p>
  
  <p>Most of the business requirements that I want to add are not bpmn related. I have decided to add my specific business requirements by working on workarounds. </p>
  
  <p>The question is, what is the preferred way to extend the Activiti process engine functionalities?</p>
  
  <p>Currently I have two general options:</p>
  
  <ol>
  <li><p>Changing the activiti source code directly. Should I edit the source code implementation classes directly? That would be faster, but wouldn't this makes upgrading to new versions harder? Or should I extend and wrap some of the implementation classes? Wouldn't this choice lead to an unexpected behavior?</p></li>
  <li><p>Use the activiti engine as a dependency then add the new functionalities by extending and wrapping some of its implementation classes. Another choice would be to add the extensions totally outside the activiti engine with totally independent data model. I don't know what is the preferred way to adapt.</p></li>
  </ol>
  
  <p>what are your opinions?</p>